#!/usr/bin/python3
# -*- coding: UTF-8 -*-

# 装饰器

# 由于函数也是一个对象，而且函数对象可以被赋值给变量，所以，通过变量也能调用该函数
def now():
    print("2017-04-05")

f = now
f()

# 函数对象有一个__name__属性，可以拿到函数的名字
print(now.__name__)
print(f.__name__)

# 增强now()函数的功能
# 在函数调用前后自动打印日志，但又不希望修改now()函数的定义，
# 这种在代码运行期间动态增加功能的方式，称之为“装饰器”（Decorator）
def log(func):
   def wrapper(*args, **kw):
       print('call %s():'%func.__name__)
       return func(*args, **kw)
   return wrapper

@log
def now():
    print('2017-03-25')

now()


# 自定义log的文本
def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print("%s %s()" %(text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log("excute")
def now():
    print('2017-04-05')

now()


